package com.cctv.order.controller;

import com.cctv.product.client.ProductClient;
import com.cctv.product.common.DecreaseStockInput;
import com.cctv.product.common.ProductInfoOutput;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

/**
 * @Author: cctv
 * @Date: 2019/6/5 15:35
 */
@RestController
@Slf4j
public class ClientController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private ProductClient productClient;

    @GetMapping("/getProductMsg")
    public String getProductMsg() {
//        // 1 第一种方式 直接使用RestTemplate url写死
//        RestTemplate restTemplate = new RestTemplate();
//        String response = restTemplate.getForObject("http://localhost:8080/msg", String.class);

        // 2 第二种方式 利用loadBalancerClient 通过应用名获取url再使用RestTemplate
//        RestTemplate restTemplate = new RestTemplate();
//        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
//        String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort())+"/msg";
//        String response = restTemplate.getForObject(url, String.class);
//
//        // 3 第三种方式 利用@LoadBalanced 可在restTemplate 里使用应用名字
//        String response = restTemplate.getForObject("http://PRODUCT/msg",String.class);


        // 采用feign方式 接口加注解 声明式REST客户端 伪rpc
        String response = productClient.productMsg();
        log.info("response={}", response);


        return response;
    }

    @GetMapping("/getProductList")
    public String getProductList() {
        List<ProductInfoOutput> response =  productClient.listForOrder(Arrays.asList("157875227953464068"));
        log.info("response={}", response);
        return "ok";
    }

    @GetMapping("/productDecreaseStock")
    public String decreaseStock() {
        productClient.decreaseStock(Arrays.asList(new DecreaseStockInput("157875227953464068",1)));
        return "ok";
    }
}
